Kotlin SAM変換
典型例としては、view.setOnClickListener { someFun() }
setOnClickListenerの引数は、View.OnClickListener インターフェスを持つオブジェクトが必要
で、View.OnClickListenerは、overrideするメソッドは、OnClick(v:View?)のみ
なので、1つなら、override fun...と書かずに、いきなりlabmda, {}でok
ついでに、kotlinで、最後の引数が関数型は、()を外して lambdaで書ける。
結果、view.setOnClickListener {someFun() } とスッキリ書ける
{v -> someFun(v)} と 引数が必要なら、vは残す。もしくは、itにする
以下は、模索してたころに書いたもの
---
Single Abstract Method Interface を 関数リテラル表記で済ませてしまうこと 実装1つだけなので、そこの実装した関数部分だけあれば、OKという話。
javaなどの冗長な記述から、kotlinによるコードの見た目の改善、JVMベースではたぶん同じ。 理解の前段階として、引数に無名関数を渡すに馴染んでおく必要があると思う。
python, javascriptでよくやった。
やってることは違う(関数を渡すのではなく、そのインターフェスを持つオブジェクトを作ってる)けど。
そこから実装をoverrideした?インターフェースを、その型を持つオブジェクとして変数に代入したり、評価したりする。
例えば、Collections.sortの 引数には、
comparatorインターフェースを実装したオブジェクトが期待されていて、
その際に、そのインターフェースに実装すべきメソッドが1つしかない場合、
その実装を、ラムダ式で渡せば、kotlinがコンパイル時に、変換してくれる?
manualの文法の形が読めるようになるまで、まだ時間かかる。
comparatorだと、abstractが一個しかない.(super classには存在するが)
https://gyazo.com/3b8ef1bc13840b4fc037e6c0de48d35b
参考:
以下の条件を満たすcallback interfaceを single operation callback interface と呼ぶ。
interfaceで約束事?が1つのみの場合に、特例扱いするのはよくあることなのかもしれない。